'use strict';
const path = require('path')
const semver = require('semver')
const colors = require('colors/safe')
const userHome = require('user-home')
const pathExists = require('path-exists').sync
const commander = require('commander')
const pkg = require('../package.json')
const log = require('@zmz-cli-dev/log')
const { getNpmSemverVersion } = require('@zmz-cli-dev/get-npm-info')
const exec = require('@zmz-cli-dev/exec')
const { DEFAULT_CLI_HOME } = require('./constant');
const program = new commander.Command()

// 检查cli版本号
function checkPkgVersion() {
  log.notice('zmz-cli-dev version:', pkg.version)
}

// 检查是否是root用户(对root用户进行权限检查并降级)
function checkRoot() {
  const rootCheck = require('root-check')
  rootCheck() // 将权限进行降级，方便读写需要权限操作的文件(0 => 501) 0: root权限; 501: 普通用户权限
}

// 检查用户主目录是否存在   /Users/zhangmin
function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error(colors.red('当前登录用户主目录不存在'))
  }
}

// 解析命令参数
// function checkInputArgs() {
//   const minimist = require('minimist')
//   const args = minimist(process.argv.slice(2))
//   checkArgs(args)
// }

// function checkArgs(args) {
//   if(args.debug){
//     process.env.LOG_LEVEL = 'verbose'
//   }else{
//     process.env.LOG_LEVEL = 'info'
//   }
//   log.level = process.env.LOG_LEVEL
// }

function checkEnv() {
  const dotEnv = require('dotenv')
  const dotEnvPath = path.resolve(userHome, '.env') // /Users/zhangmin/.env
  if (pathExists(dotEnvPath)) {
    dotEnv.config({
      path: dotEnvPath
    })
  }
  createDefaultConfig()
}

function createDefaultConfig() {
  const cliConfig = {
    home: userHome
  }
  if (process.env.CLI_HOME) {
    cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
  } else { 
    cliConfig['cliHome'] = path.join(userHome, DEFAULT_CLI_HOME)
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome
}

// 检查全局更新
async function checkGlobalUpdate() {
  const { version, name } = pkg
  const lastVersion = await getNpmSemverVersion(version, name)
  if (lastVersion && semver.gt(lastVersion, version)) { // 判断lastVersion是否大于当前版本号
    log.warn('更新提示：', colors.yellow(`请手动更新 ${name}，当前版本：${version}，最新版本：${lastVersion}，更新命令：npm install -g ${name}`))
  }
}

// 注册脚手架命令
function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false)
    .option('--tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '')
  program
    .command('init [projectName]')
    .description('初始化项目')
    .option('-f, --force', '是否强制初始化项目')
    .action(exec)
  
  // 监听debug参数
  program.on('option:debug', function () {
    if (program.opts().debug) {
      process.env.LOG_LEVEL = 'verbose'  // 级别低于info
    } else {
      process.env.LOG_LEVEL = 'info'
    }
    log.level = process.env.LOG_LEVEL
    // log.verbose('debug', program.opts().debug)
  })

  // 监听targetPath参数
  program.on('option:targetPath', function(){
    process.env.CLI_TARGET_PATH = program.opts().targetPath // 存入环境变量中
  })

  // 监听未知命令
  program.on('command:*', function (obj) {
    const availableCommands = program.commands.map(cmd => cmd.name())
    log.error('未知命令：', colors.red(obj[0]))
    if (availableCommands.length > 0) {
      log.info('可用命令：', colors.green(availableCommands.join(',')))
    }
  })
  program.parse(process.argv)  // 解析参数
  if (program.args && program.args.length < 1) {
    program.outputHelp()
    console.log()
  }
  
}

async function prepare() {
  checkPkgVersion()
  checkRoot()
  checkUserHome()
  checkEnv()
  await checkGlobalUpdate()
}

async function core() {
  try {
    await prepare()
    registerCommand()
  } catch (error) {
    log.error(error.message)
    if (program.opts().debug){
      console.log(error)
    }
  }
}




module.exports = core;
